package pers.huangyuhui.sms.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import pers.huangyuhui.sms.model.ClazzInfo;
import pers.huangyuhui.sms.model.Paging;
import pers.huangyuhui.sms.service.ClassService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("classController")
public class ClassController {

    // 使用自动注入!
    @Autowired
    private ClassService classService;

    // 写个返回值……String数组
    private String[] result = {"success" , "failure" , "error"};

    /**
     * @param className 班级名，用于过滤班级列表
     * @param currentPage 当前页码，用于分页显示班级列表
     * @param pageSize 分页长度，每页显示的班级数量
     * @param fromStuInfoPage 用来判断请求的来源。如果值为"combox"，表示请求来自学生信息页面
     * @return Object类型 如果是正常请求来源则返回由表长和列表组成{@code Map}的{@code data}
     * <p>Void类型,如果来源是"combox",则直接返回{@code List}列表
     */
    @PostMapping("/getClassList.do")
    @ResponseBody
    private Object getClassList(
//    private void getClassList(
//            HttpServletResponse response,
            @RequestParam(name = "className", required = false , defaultValue = "") String className,
            @RequestParam(name = "page" , required = false , defaultValue = "1") Integer currentPage,
            @RequestParam(name = "rows" , required = false , defaultValue = "999") Integer pageSize,
            @RequestParam(name = "from" , required = false , defaultValue = "") String fromStuInfoPage){
        // 获取分页后的班级列表
        ClazzInfo clazzInfo = new ClazzInfo();
        clazzInfo.setName(className);
        Paging paging = new Paging(currentPage, pageSize);

        // 将需要的参数整合到 map 中
        Map<String , Object> map = new HashMap<>();
        map.put("name", clazzInfo.getName());
        map.put("start", paging.getPageStart());
        map.put("size", paging.getPageSize());

        // 这里使用 classService 中的 getClassList 的方法获取班级列表
        List<ClazzInfo> clazzList = classService.getClassList(map);

        // 同上,获取班级列表总有多长
        int totalNum = classService.getClassListNum(clazzInfo);

        // 将以上数据转化成 JSON 数据
        Map<Object , Object> data = new HashMap<>();
        data.put("total" , totalNum);
        data.put("rows" , clazzList);

        // 解决学生信息管理页面中班级名称下拉框无数据显示问题
        // 以下是使用 Object 类型返回来处理多返回值类型的问题
        if ("combox".equals(fromStuInfoPage)) {
//            int i = 0;
//            Map<Object , Object> datas = new HashMap<>();
//            for (ClazzInfo clazz : clazzList) {
//                datas.put( i++ , clazz);
//            }
            // 直接回传班级列表!!!
            return clazzList;
        } else {
            // 在班级信息管理页面中显示班级列表信息
            return data;
        }

        /*
        ** 下边使用 空返回类型 的方法,即和 Servlet 一样使用 Response 做回传
        ** 如果想要使用这种方法,请先将上方的 object 类型返回方式进行注释
        ** 再把方法名称 private void getClassList( 以及其下方的 response 参数接触注释
        ** 最后把下方的方法代码解除注释 - 注释与解除注释快捷键:CTRL + /
        */
//        try {
//            // 这里是用来解决乱码问题的
//            response.setContentType("application/json;charset=UTF-8");
//            if ("combox".equals(fromStuInfoPage)) {
//                response.getWriter().write(JSONArray.toJSONString(clazzList));
//            } else {
//                // 在班级信息管理页面中显示班级列表信息
//                response.getWriter().write(JSONObject.toJSONString(data));
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }

    /**
     * @param clazzInfo 将要被添加的班级信息,利用{@code Spring}的数据自动绑定
     * @return 添加成功返回"success",失败返回"failure",异常返回"error"
     */
    @PostMapping("/addClass.do")
    @ResponseBody
    private String addClass(ClazzInfo clazzInfo){
//        System.out.println(clazzInfo);

        try {
            if (classService.addClass(clazzInfo)){
                // 添加成功返回 success
                return result[0];
            } else {
                // 否则返回 failure
                return result[1];
            }
        } catch (Exception e) {
            e.printStackTrace();
            // 抑或返回 error
            return result[2];
        }
    }

    /**
     * @param clazzInfo 将要被修改的班级信息,利用{@code Spring}的数据自动绑定
     * @return 修改成功返回"success",失败返回"failure",异常返回"error"
     */
    @PostMapping("/editClass.do")
    @ResponseBody
    private String editClass(ClazzInfo clazzInfo){
        // 整体逻辑和添加班级一模一样!!!
        try {
            if (classService.editClassInfo(clazzInfo)){
                return result[0];
            } else {
                return result[1];
            }
        } catch (Exception e) {
            e.printStackTrace();
            return result[2];
        }
    }

    /**
     * @param classId 即将被删除的班级{@code classId}
     * @return 删除成功返回"success",失败返回"failure",异常返回"error"
     */
    @PostMapping("/deleteClass.do")
    @ResponseBody
    private String deleteClass(@RequestParam(value = "classid" , required = false , defaultValue = "") Integer classId){
        // 整体逻辑和添加班级一模一样!!!
        try {
            if (classService.deleteClass(classId)) {
                return result[0];
            } else {
                return result[1];
            }
        } catch (Exception e) {
            e.printStackTrace();
            return result[2];
        }
    }
}
